package com.wavefax.minbang.xu.learning.servlet01;

import com.alibaba.fastjson.JSONObject;
import com.wavefax.minbang.xu.learning.utils.CsvToJsonUtil;
import com.wavefax.minbang.xu.learning.utils.ExcelToJsonUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class MyServletThree extends HttpServlet {
    //接受上传的文件
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");	//设置编码

        //获得磁盘文件条目工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //获取文件需要上传到的路径
        String path = "D:/wavefax/uploadFiles";
        //注意此路径不能直接复制windows的路径，复制后需要修改反斜杠为斜杠

        //如果没以下两行设置的话，上传大的文件会占用很多内存，
        //设置暂时存放的存储室, 这个存储室，可以和最终存储文件的目录不同

         //原理：把文件分割，分割后各部分先存到暂时存储室，然后在真正写到对应目录的硬盘上，
         //按理来说当上传一个文件时，其实是上传了两份，第一个是在缓冲区以.tem格式

        factory.setRepository(new File(path));
        //设置存储室的大小，当上传文件的容量超过该缓存时，使用临时文件缓存上传文件
        factory.setSizeThreshold(1024*1024) ;

        //API文件上传处理
        ServletFileUpload upload = new ServletFileUpload(factory);

        String filename = "";


        try {
            //可以上传多个文件
            List<FileItem> list = upload.parseRequest(request);

            for(FileItem item : list)
            {
                //获取表单的属性名字
                String name = item.getFieldName();


                //如果获取的表单信息是普通的文本信息
                if(item.isFormField())
                {
                    //获取用户具体输入的字符串，表单提交过来的是字符串类型的
                    String value = item.getString() ;
                    request.setAttribute(name, value);
                }
                //对传入的非简单的字符串进行处理，比如文件
                else
                {
                    /*
                     * 以下四步，主要获取上传文件的名字
                     */
                    //获取路径名
                    String value = item.getName() ;
                    //索引到最后一个反斜杠
                    int start = value.lastIndexOf("\\");
                    //截取上传文件的字符串名字，加1是去掉反斜杠（有两条）

                    //获取时间戳
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                    String timeStamp = sdf.format(new Date());

                    //文件名
                    String realFilename = value.substring(start+1);

                    //上传后的文件名=时间戳+原文件名
                    filename = timeStamp+realFilename;
                    //将文件内容输出为json文件的文件名
                    //不包含类型的文件名
                    String pureFilename = realFilename.substring(0,realFilename.indexOf("."));
                    String jsonfilename = timeStamp+realFilename+".json";




                    //真正写到磁盘上
                    //它抛出的异常 用exception 捕捉

                    //上传文件到指定路径
                    OutputStream out = new FileOutputStream(new File(path,filename));

                    InputStream in = item.getInputStream() ;

                    int length = 0 ;
                    //缓冲区，大小为1字节
                    byte [] buf = new byte[1024] ;


                    // in.read(buf) 每次读到的数据存放在buf 数组中
                    while( (length = in.read(buf) ) != -1)
                    {
                        //在buf 数组中取出数据通过输出流写到磁盘上，off为字符偏移量
                        out.write(buf, 0, length);

                    }

                    in.close();
                    out.close();
                    System.out.println("上传文件："+value+"成功");
                    //判断已上传的文件的类型，对xls、xlsx格式的文件进一步处理，读取其内容写成json文件
                    if(filename.endsWith(".xls")||filename.endsWith(".xlsx")){
                        ExcelToJsonUtil excelToJsonUtil = new ExcelToJsonUtil();
                        excelToJsonUtil.ExcelToJson(path+"/"+filename,null,null);
                        System.out.println("提取"+value+"内容写入json文件成功");
                    }//判断已上传的文件的类型，对csv格式的文件进一步处理，读取其内容写成json文件
                    else if(filename.endsWith(".csv")){
                        CsvToJsonUtil csvToJsonUtil = new CsvToJsonUtil();
                        csvToJsonUtil.readcsv(path+"/"+filename);
                    }
                }

            }
            System.out.println("上传的文件总数量："+list.size()+"个");




        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            //e.printStackTrace();
        }
    }
}
